package com.briup.day10;

/**
 * @author 谭梦寻
 * @version 1.1
 * 比较字符串内容组成 使用equals
 *  如果使用 == 不仅会因为堆中不同对象而不同
 *  还会因为是否是出于常量池而出现不一样的结果
 *  String.valueOf()将其他类型转化成String类型
 */
public class TestString {
    //    双击shift键 查看源码
    public static void main(String[] args) {
//    1 创建一个空字符串方式 new关键字是在堆中新建的对象
        String s = new String();
//
        String s1 = new String("abc");
        System.out.println(s1.hashCode());//96354 hashCode被重写了
//        获取对象的地址hashCode 原始hashCode值
        System.out.println(Integer.toHexString(System.identityHashCode(s1)));//1b6d3586
        char[] arr = {'a', 'b', 'c'};
        String s2 = new String(arr);
        byte[] bytes = {97,98,99};
        String s3 = new String(bytes);
        System.out.println(s3);//abc
//        操作字符串对象 本质上就是操作一个字符数组
//        char []
        int size = s1.length();
        System.out.println(size);
        String a1 = "abc";//在字符串常量池中新建一个字符对象abc
        String a2 = "abc";//在字符串常量池中查找字符对象abc
        System.out.println(a1 == a2);//true
        System.out.println(s1 == a1);//false new关键字是在堆中新建的对象
        String a3 = "a"+"b"+"c";//在字符串常量池中新建3个字符对象 a、b、c
//        但是最终指向的对象 还是指向了常量池中唯一的对象 abc
        System.out.println(Integer.toHexString(System.identityHashCode(a1)));//4554617c
        System.out.println(Integer.toHexString(System.identityHashCode(a3)));//4554617c
        String a4 = "ab";
//  使用常量拼接后 使用的还是常量池中的对象 但是变量和常量拼接后使用的是堆中的对象
        a4 = a4 + "c";
        System.out.println(Integer.toHexString(System.identityHashCode(a4)));//74a14482
        System.out.println(a2 == a4);//false a4指向了堆空间
//        intern()方法 如果字符串常量池中包含该字符串 则返回该字符串常量池对象
        String b = new String("abc").intern();
        System.out.println(a2 == b);//true

//        String.join()
        String s4 = String.join("-", "a", "b","c");
//        发生类型转化 多态 -- 接口类型的引用可以指向任意接口实现类对象 -> CharSequence
        System.out.println(s4);
    }
}
